package com.example.demo.mapper;

import com.example.demo.client.evt.sysbasequery.QueryUserEvt;
import com.example.demo.client.vm.cssmqry.user.UserVm;
import com.example.demo.client.vm.sysbasequery.QueryUserVm;
import com.example.demo.domain.User;
import com.example.demo.web.rest.evt.RelationEvt;
import com.example.demo.web.rest.evt.ResourceRelationEvt;
import com.example.demo.web.rest.evt.SaveUserConfigEvt;
import com.example.demo.web.rest.evt.UserPolicyEvt;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 用户管理
 *
 * @Author zmf
 * @Date 2018/9/1  19:23
 */
@Mapper
public interface UserMapper {
    /**
     * 根据用户id删除用户角色关系
     * @param userId
     * @return
     */
    Integer delUserRoleByUserId(Long userId);
    /**
     * 根据用户id删除用户权限关系
     * @param userId
     * @return
     */
    Integer delUserPermissionByUserId(Long userId);
    /**
     * 根据用户id删除用户已经分配的资源
     * @param userId
     * @return
     */
    Integer delResourceByUserId(Long userId);
    /**
     * 根据用户id删除用户用户组关系
     * @param userId
     * @return
     */
    Integer delGroupUserByUserId(Long userId);
    /**
     * 删除用户和用户组关系
     * @param relationEvt
     * @return
     */
    Integer delGroupUserByUserIdAndGroupIds(RelationEvt relationEvt);
    /**
     * 添加用户组和用户关系
     * @param relationEvt
     * @return
     */
    Integer addGroupUserByUserIdAndGroupIds(RelationEvt relationEvt);
    /**
     * 删除用户权限关系
     * @param userIds
     * @param permissionIds
     * @return
     */
    Integer delUserPermission(@Param(value = "userIds") List<String> userIds,
                              @Param(value = "permissionIds") List<String> permissionIds);
    /**
     * 删除用户和权限关系
     * @param relationEvt
     * @return
     */
    Integer delUserPermissionByUserIdAndPermissionIds(RelationEvt relationEvt);
    /**
     * 添加用户和权限关系
     * @param relationEvt
     * @return
     */
    Integer addUserPermissionByUserIdAndPermissionIds(RelationEvt relationEvt);
    /**
     * 删除用户与角色的关系
     * @param relationEvt
     * @return
     */
    Integer delUserRoleByUserIdAndRoleIds(RelationEvt relationEvt);
    /**
     * 添加用户和角色关系
     * @param relationEvt
     * @return
     */
    Integer addUserRoleByUserIdAndRoleIds(RelationEvt relationEvt);
    /**
     * 删除用户与资源关系
     * @param evt
     * @return
     */
    Integer delUserResource(ResourceRelationEvt evt);
    /**
     * 增加用户与资源权限关系
     * @param evt
     * @return
     */
    Integer addUserResource(ResourceRelationEvt evt);
    /**
     * 保存用户安全策略信息
     * @param evt
     * @return
     */
    Integer addUserSecurityPolicy(UserPolicyEvt evt);
    /**
     * 获取用户配置表的id
     * @param userId
     * @return
     */
    Long getUserConfId(@Param(value = "userId") Long userId);
    /**
     * 更新配置表信息
     * */
    void updateUserConf(UserPolicyEvt evt);

    /**
     * 编辑状态获取 密码更新时间
     * @param userId
     * @return
     */
    String getPasswordDateTime(@Param(value = "userId") Long userId);

    /**
     * 查询用户
     * @param evt
     * @return
     */
    List<QueryUserVm> queryUser(QueryUserEvt evt);

    /**
     * 查询用户
     * @return
     */
    List<QueryUserVm> getUserByLoginName(@Param(value = "loginName") String loginName);

    /**
     *  更新用户状态
     * */
    void updateStatus(@Param(value = "status")Integer status, @Param(value = "userId")Long userId, @Param(value = "nowDate")Date nowDate);

    /**
     * 查询用户近期使用的五个密码
     *
     * @param userId
     * @return
     */
    List<String> getNearlyFivePwd(@Param("userId") Long userId);

    /**
     * 将当前密码修改保存到密码修改表中
     *
     * @param userId
     * @return
     */
    Boolean insertPasswrodInfo(@Param("pwdId") Long pwdId,@Param("userId") Long userId, @Param("password") String password);

    /**
     * 更新当前登录用户密码信息
     *
     * @param userId
     * @return
     */
    Boolean updUserPwdInfo(@Param("userId") Long userId, @Param("password") String password);


    /**
     * 保存用户配置表
     *
     * @param evt
     * @return
     */
    Boolean saveUserConfig(SaveUserConfigEvt evt);


    /**
     * 批量修改用户配置表的是否需要修改密码状态
     */
    void updateMustUpdStatus(@Param("userId") List userId, @Param("isMustUpdPwd") String isMustUpdPwd);



    /**
     * 保存用户表
     *
     * @param user
     * @return
     */
    Boolean saveUser(User user);


    /**
     * 更新用户密码更新时间
     *
     */
    void updatePasswordDateTime(@Param("updPwdTime") Date updPwdTime , @Param("userId") Long userId);


    /**
     * 更新用户表
     *
     */
    Boolean updateUser(User user);

    /**
     * 根据登录名获取用户信息
     *
     * @param loginName
     * @return
     */
    UserVm getUser(@Param(value = "loginName") String loginName);

    /**
     * 验证手机号是否存在
     *
     */
    Integer isPhoneExist(@Param(value = "phone")String phone,@Param(value = "userId")Long userId);

    /**
     * 删除用户
     * */
    int deleteUser(@Param("status") Integer status, @Param("userId") Long userId);

    /**
     * 锁定账号有效期到期或密码有效期到期的用户
     * */
    void lockUser();

    int selectCountByLoginName(String loginName);
}
